package com.ygq.controller;


import DTO.PageStudentDTO;
import VO.ClassesVO;
import com.ygq.ClassesService;
import com.ygq.StudentService;
import constant.CodeConstant;
import constant.MessageConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import result.ClassResult;
import result.PageResult;
import result.Result;
import utils.ExcelParser;
import utils.Student;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.UUID;

/**
 * 班级信息管理
 */
@RestController
@RequestMapping("/teacher")
@Slf4j
public class ClassController {

    // 文件上传地址
    @Value("${ygq.path_excel}")
    private String path;

    @Autowired
    private ClassesService classesService;

    @Autowired
    private StudentService studentService;

    /**
     * 获取班级信息
     * @return
     */
    @GetMapping("/getClasses")
    public ClassResult<List<ClassesVO>> getClasses(){
        return classesService.getClasses();
    }

    /**
     * 班级人员分页查询，四个参数
     */
    @PostMapping("/getStudent")
    public Result<PageResult> pageResultResult(@RequestBody PageStudentDTO pageStudentDTO){
        PageResult pageResult = studentService.page(pageStudentDTO);
        return Result.success(pageResult);
    }

    /**
     * excle文件上传，添加班级
     */
    @PostMapping("/upload")
    public Result<String> handleFileUpload(MultipartFile file){

        // 1. 获取原始文件名   == 班级名称 有后缀名
        String fileName = file.getOriginalFilename();

        // 2. 获取原始文件名的后缀名
        String fileSuffix = fileName.substring(fileName.lastIndexOf(".") + 1);

        // 3. 判断文件格式
        if(!isExcelFile(fileSuffix)){
            return Result.error("文件格式不正确，请使用xls xlsx格式文件",305);
        }
        // 4. 获取班级名
        String className = fileName.substring(0,fileName.lastIndexOf('.'));

        String fileNewName = UUID.randomUUID() + "-" + fileName;
        saveFile(file,path,fileNewName);
        File fileExcel = new File(path+fileNewName);
        List<Student> students = ExcelParser.parseExcelFile(fileExcel);
        if (students.isEmpty()){
            // 表明这个文件并没有解析到数据及这个文件没有学生信息数据，返回错误状态码301
            return Result.error("该文件并没有解析到学生数据",301);
        }
        if (students.get(0).getStudentNumber().equals("500")){
            // 表明文件解析失败，状态码502
            return Result.error(MessageConstant.PARSING_FAILED, CodeConstant.PARSING_FAILED);
        }
        //将这个students和 className 传递给service进行学生班级详细添加处理
        studentService.addClassAndStudent(students,className);
        return Result.success("文件上传成功");
    }

    /**
     * 更改默认班级
     */
    @GetMapping("/updateDefaultClass")
    public Result<String> updateDefaultClass(Integer id, Integer defaultClass){
        if ( defaultClass != 0 ){
            return Result.error("错误",500);
        }

        classesService.updateDefaultClass(id);
        return Result.success("修改成功");
    }

    /**
     * 删除班级
     */
    @DeleteMapping("/deleteClass")
    public Result<String> deleteClass(Integer id){
        classesService.deleteClass(id);
        return Result.success("删除成功");
    }



    // 文件保存
    public void saveFile(MultipartFile file, String filePath, String newFileName) {
        try {
            byte[] bytes = file.getBytes();
            Path path = Paths.get(filePath + File.separator + newFileName);
            Files.write(path, bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 判断是否是excel文件
    public static boolean isExcelFile(String fileExtension) {
        // Excel文件的常见后缀名
        String[] excelExtensions = {"xls", "xlsx"};

        // 将文件后缀名转换为小写，以便进行不区分大小写的比较
        fileExtension = fileExtension.toLowerCase();

        // 检查文件后缀名是否在Excel后缀名数组中
        for (String extension : excelExtensions) {
            if (extension.equals(fileExtension)) {
                return true; // 是Excel文件
            }
        }

        return false; // 不是Excel文件
    }
}
